import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'

// 创建axios实例 将来对创建出来的实例 进行自定义配置
// 不会污染原始的axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 设置请求url 要进行跨域操作 不能直接访问后端地址
  timeout: 600000 // 设置超时时间
})

// 添加请求拦截器
service.interceptors.request.use(function (config) {
  // 只要有token 就在请求时携带 便于请求需要授权的接口
  const token = store.getters.token
  if (token) {
    config.headers.token = token
  } else if (token && config.url !== '/login') {
    window.location.href = '/login'
    return false
  }

  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?'
    for (const propName of Object.keys(config.params)) {
      const value = config.params[propName]
      const part = encodeURIComponent(propName) + '='
      if (value !== null && typeof (value) !== 'undefined') {
        if (typeof value === 'object') {
          for (const key of Object.keys(value)) {
            const params = propName + '[' + key + ']'
            const subPart = encodeURIComponent(params) + '='
            url += subPart + encodeURIComponent(value[key]) + '&'
          }
        } else {
          url += part + encodeURIComponent(value) + '&'
        }
      }
    }
    url = url.slice(0, -1)
    config.params = {}
    config.url = url
  }

  return config
}, function (error) {
  return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数
  if (response.data.status === 401) {
    router.push('/login')
  }
  if (response.data.code === 0) {
    Message.error(response.data.msg)
    return Promise.reject(response.data.msg)
  } else if (response.data.code === 1) {
    return response
  }
  return response
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数
  if (error && error.response) {
    switch (error.response.status) {
      case 401:
        router.push('/login')
        break
      case 405:
        error.message = '请求错误'
    }
  }
  return Promise.reject(error)
})

export default service
